// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
  pub val: i32,
  pub left: Option<Rc<RefCell<TreeNode>>>,
  pub right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
  #[inline]
  pub fn new(val: i32) -> Self {
    TreeNode {
      val,
      left: None,
      right: None
    }
  }
}

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn preorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
        let mut result: Vec<i32> = vec![];
        if root.is_some() {
            Self::do_preorder(root, &mut result);
        }
        result
    }

    fn do_preorder(root: Option<Rc<RefCell<TreeNode>>>, ret: &mut Vec<i32>) {
        if root.is_none() {
            return;
        }

        let rc = root.unwrap();
        ret.push(rc.borrow().val);
        if rc.borrow().left.is_some() {
            Self::do_preorder(rc.borrow().left.clone(), ret);
        }
        if rc.borrow().right.is_some() {
            Self::do_preorder(rc.borrow().right.clone(), ret);
        }
    }
}